home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 October: Mac OS SDK / Dev.CD Oct 96 SDK / Dev.CD Oct 96 SDK2.toast / Development Kits (Disc 2) / OpenDoc Development Framework / ODFDev / Bitmap / Sources / Content.cpp < prev    next >
Encoding:
Text File  |  1996-08-16  |  12.9 KB  |  431 lines  |  [TEXT/MPS ]

  1. //========================================================================================
  2. //
  3. //    File:                Content.cpp
  4. //    Release Version:    $ ODF 1 $
  5. //
  6. //    Author:                Mary Boetcher
  7. //
  8. //    Copyright:    (c) 1993 - 1996 by Apple Computer, Inc., all rights reserved.
  9. //
  10. //========================================================================================
  11.  
  12. #include "Bitmap.hpp"
  13.  
  14. #ifndef CONTENT_H
  15. #include "Content.h"
  16. #endif
  17.  
  18. #ifndef PART_H
  19. #include "Part.h"
  20. #endif
  21.  
  22. #ifndef SELECT_H
  23. #include "Select.h"
  24. #endif
  25.  
  26. // ----- Part Layer -----
  27.  
  28. #ifndef FWUTIL_H
  29. #include "FWUtil.h"
  30. #endif
  31.  
  32. // ----- OS Layer -----
  33.  
  34. #ifndef FWODMISC_H
  35. #include "FWODMisc.h"
  36. #endif
  37.  
  38. #ifndef FWPICTUR_H
  39. #include "FWPictur.h"
  40. #endif
  41.  
  42. #ifndef FWBARRAY_H
  43. #include "FWBArray.h"
  44. #endif
  45.  
  46. #ifndef FWFILEAC_H
  47. #include "FWFileAc.h"
  48. #endif
  49.  
  50. #ifndef SLMixOS_H
  51. #include "SLMixOS.h"
  52. #endif
  53.  
  54. #ifndef FWFILESY_H
  55. #include "FWFileSy.h"
  56. #endif
  57.  
  58. #ifndef FWFILREP_H
  59. #include "FWFilRep.h"
  60. #endif
  61.  
  62. // ----- Foundation Layer -----
  63.  
  64. #ifndef FWSTREAM_H
  65. #include "FWStream.h"
  66. #endif
  67.  
  68. #ifndef FWMEMORY_H
  69. #include "FWMemory.h"
  70. #endif
  71.  
  72. // ----- OpenDoc Includes -----
  73.  
  74. #ifndef SOM_Module_OpenDoc_StdProps_defined
  75. #include <StdProps.xh>
  76. #endif
  77.  
  78. #ifndef SOM_ODTranslation_xh
  79. #include <Translt.xh>
  80. #endif
  81.  
  82. #ifndef SOM_ODSession_xh
  83. #include <ODSessn.xh>
  84. #endif
  85.  
  86. //========================================================================================
  87. //    Runtime Information
  88. //========================================================================================
  89.  
  90. #ifdef FW_BUILD_MAC
  91. #pragma segment odfbitmap
  92. #endif
  93.  
  94. //========================================================================================
  95. //    class CBitmapContent
  96. //========================================================================================
  97.  
  98. FW_DEFINE_AUTO(CBitmapContent)
  99.  
  100. //----------------------------------------------------------------------------------------
  101. //    CBitmapContent::CBitmapContent
  102. //----------------------------------------------------------------------------------------
  103. //    CBitmapContent constructor
  104.  
  105. CBitmapContent::CBitmapContent(Environment* ev, CBitmapPart* part) :
  106.     FW_CContent(ev, part),
  107.     fBitmapPart(part)
  108. {
  109.     FW_END_CONSTRUCTOR
  110. }
  111.  
  112. //----------------------------------------------------------------------------------------
  113. //    CBitmapContent::~CBitmapContent
  114. //----------------------------------------------------------------------------------------
  115. //    CBitmapContent destructor
  116.  
  117. CBitmapContent::~CBitmapContent()
  118. {
  119.     FW_START_DESTRUCTOR
  120. }
  121.  
  122. //----------------------------------------------------------------------------------------
  123. //    CBitmapContent::GetBitmap
  124. //----------------------------------------------------------------------------------------
  125.  
  126. FW_CBitmap CBitmapContent::GetBitmap(Environment* ev) const
  127. {
  128.     if ((const void*)fBitmap == NULL)
  129.     {
  130.         // ----- Fool the compiler -----
  131.         CBitmapContent* self = (CBitmapContent*)this;
  132.         self->UseDefaultBitmap(ev);
  133.     }
  134.     
  135.     return fBitmap;
  136. }
  137.  
  138. //----------------------------------------------------------------------------------------
  139. //    CBitmapContent::UseDefaultBitmap
  140. //----------------------------------------------------------------------------------------
  141. void CBitmapContent::UseDefaultBitmap(Environment* ev)
  142. {
  143.     FW_CSharedLibraryResourceFile resFile(ev);
  144.     
  145. #ifdef FW_BUILD_MAC
  146.     FW_CPicture picture(resFile, 2128);
  147.     fBitmap = FW_CBitmap(picture);
  148. #endif
  149. #ifdef FW_BUILD_WIN
  150.     fBitmap = FW_CBitmap(resFile, 2128);
  151. #endif
  152. }
  153.  
  154. //----------------------------------------------------------------------------------------
  155. //    CBitmapContent::Externalize
  156. //----------------------------------------------------------------------------------------
  157. //    ODF method
  158.  
  159. void CBitmapContent::Externalize(Environment* ev,
  160.                                   ODStorageUnit* storageUnit,
  161.                                   FW_EStorageKinds storageKind,
  162.                                   FW_CCloneInfo* cloneInfo)
  163. {
  164.     // To test if fBitmap is NULL, cast it to a const void*
  165.     if ((const void*)fBitmap != NULL)
  166.     {
  167.         ExternalizeBitmapShape(ev, storageUnit, fBitmap);
  168.         
  169.         if (storageKind != FW_kPartStorage)
  170.             ExternalizePICTData(ev, storageUnit, fBitmap);
  171.     }
  172. }
  173.  
  174. //----------------------------------------------------------------------------------------
  175. //    CBitmapContent::ExternalizeBitmapShape
  176. //----------------------------------------------------------------------------------------
  177.  
  178. void CBitmapContent::ExternalizeBitmapShape(Environment* ev,
  179.                                           ODStorageUnit* storageUnit,
  180.                                           const FW_CBitmap& bitmap)
  181. {
  182.     FW_PStorageUnitSink suSink(ev, storageUnit, kODPropContents, fBitmapPart->GetPartKind(ev));
  183.     FW_CWritableStream archive(suSink);
  184.     archive << bitmap;
  185. }
  186.  
  187. #ifdef FW_BUILD_MAC
  188. //---------------------------------------------------------------------------------------
  189. //    CBitmapContent::ExternalizePICTData
  190. //---------------------------------------------------------------------------------------
  191.  
  192. void CBitmapContent::ExternalizePICTData(Environment* ev, ODStorageUnit* destinationSU, const FW_CBitmap& bitmap)
  193. {
  194.     FW_SUAddPropValue(ev, destinationSU, kODPropContents, FW_CPart::gMacPICTDataType);
  195.     
  196.     FW_PStorageUnitSink suSink(ev, destinationSU, kODPropContents, FW_CPart::gMacPICTDataType);
  197.     FW_CWritableStream stream(suSink);
  198.     
  199.     FW_CPicture picture = bitmap.MacGetAsPicture();
  200.     
  201.     FW_PlatformPict platformPict = picture.GetPlatformPict();
  202.  
  203.     unsigned long pictSize = FW_CMemoryManager::GetSystemHandleSize((FW_PlatformHandle)platformPict);
  204.     
  205.     FW_CAcquireLockedSystemHandle lockedHandle((FW_PlatformHandle)platformPict);
  206.     stream.Write(lockedHandle.GetPointer(), pictSize);    
  207. }
  208. #endif
  209.  
  210. //----------------------------------------------------------------------------------------
  211. //    CBitmapContent::Internalize
  212. //----------------------------------------------------------------------------------------
  213. //    ODF method
  214.  
  215. FW_Boolean CBitmapContent::Internalize(Environment* ev,
  216.                                     ODStorageUnit* storageUnit, 
  217.                                      FW_EStorageKinds storageKind,
  218.                                     FW_CCloneInfo* cloneInfo)
  219. {
  220.     if (storageUnit->Exists(ev, kODPropContents, fBitmapPart->GetPartKind(ev), 0))
  221.     {
  222.         InternalizeBitmapShape(ev, storageUnit);
  223.     }
  224. #ifdef FW_BUILD_MAC
  225.     else if (storageUnit->Exists(ev, kODPropContents, FW_CPart::gMacPICTFileType, 0))
  226.     {
  227.         InternalizePICTFile(ev, storageUnit);
  228.     }
  229.     else if (storageUnit->Exists(ev, kODPropContents, FW_CPart::gMacPICTDataType, 0))
  230.     {
  231.         InternalizePICTData(ev, storageUnit);
  232.     }
  233. #endif
  234.     else 
  235.     {
  236.         FW_DEBUG_MESSAGE("CBitmapContent::InternalizeContent - Unknown type");
  237.         return false;
  238.     }
  239.  
  240.     return true;
  241. }
  242.  
  243. //---------------------------------------------------------------------------------------
  244. //    CBitmapContent::InternalizeBitmapShape
  245. //---------------------------------------------------------------------------------------
  246.  
  247. void CBitmapContent::InternalizeBitmapShape(Environment* ev, ODStorageUnit* storageUnit)
  248. {
  249.     FW_PStorageUnitSink suSink(ev, storageUnit, kODPropContents, fBitmapPart->GetPartKind(ev));
  250.     if (suSink->GetReadableBytes(ev) != 0)
  251.     {
  252.         FW_PBufferedSink sink(ev, suSink);
  253.         FW_CReadableStream stream(sink);
  254.         stream >> fBitmap;
  255.     }
  256. }
  257.  
  258. #ifdef FW_BUILD_MAC
  259. //---------------------------------------------------------------------------------------
  260. //    CBitmapContent::InternalizePICTData
  261. //---------------------------------------------------------------------------------------
  262.  
  263. void CBitmapContent::InternalizePICTData(Environment* ev, ODStorageUnit* storageUnit)
  264. {
  265.     FW_PStorageUnitSink suSink(ev, storageUnit, kODPropContents, FW_CPart::gMacPICTDataType);
  266.     FW_PBufferedSink sink(ev, suSink);
  267.     FW_CReadableStream stream(sink);
  268.  
  269.     unsigned long pictSize = storageUnit->GetSize(ev);    //sink.GetLength();
  270.  
  271.     FW_CAcquireTemporarySystemHandle handle(pictSize);
  272.  
  273.     stream.Read(handle.GetPointer(), pictSize);
  274.     
  275.     MacSetBitmap(ev, (FW_PlatformPict)handle.GetPlatformHandle());
  276. }
  277. #endif
  278.  
  279. #ifdef FW_BUILD_MAC
  280. //---------------------------------------------------------------------------------------
  281. //    CBitmapContent::InternalizePICTFile
  282. //---------------------------------------------------------------------------------------
  283.  
  284. void CBitmapContent::InternalizePICTFile(Environment* ev, ODStorageUnit* storageUnit)
  285. {
  286.     if (storageUnit->Exists(ev, kODPropContents, FW_CPart::gMachfsDataType, 0))
  287.     {
  288.         storageUnit->Focus(ev, kODPropContents, kODPosUndefined, FW_CPart::gMachfsDataType, 0, kODPosUndefined);
  289.         
  290.         // Get the HFS flavor
  291.         HFSFlavor hfsInfo;
  292.         
  293.         FW_CByteArray byteArray;
  294.         storageUnit->GetValue(ev, sizeof(HFSFlavor), byteArray);
  295.         byteArray.CopyBuffer(&hfsInfo, sizeof(HFSFlavor));
  296.         
  297.         // Use the FileSpec in HFS flavor to open the file's data fork
  298.         FW_PFileSpecification fileSpec(ev, hfsInfo.fileSpec);
  299.         FW_CAccessPermission permission(FW_kRead, FW_kDenyWrite);
  300.         FW_PFile pictFile(ev, fileSpec, permission);
  301.         FW_PFileSink pictSink(ev, pictFile);
  302.     
  303.         // Read the picture data from the file
  304.         #define kPICTHeaderSize 512
  305.         unsigned long pictSize = pictSink->GetLength(ev) - kPICTHeaderSize;
  306.         
  307.         FW_CAcquireTemporarySystemHandle tempHandle(pictSize);
  308.         
  309.         pictSink->SetPosition(ev, kPICTHeaderSize);    // skip PICT file header
  310.         pictSink->Read(ev, tempHandle.GetPointer(), pictSize);
  311.         
  312.         MacSetBitmap(ev, (FW_PlatformPict)tempHandle.GetPlatformHandle());
  313.     }    
  314. }
  315. #endif
  316.  
  317. #ifdef FW_BUILD_MAC
  318. //----------------------------------------------------------------------------------------
  319. //    CBitmapContent::MacSetBitmap
  320. //----------------------------------------------------------------------------------------
  321. //    Set the bitmap from from a pict handle. The FW_PlatformPict should be deleted by the 
  322. //    caller
  323.  
  324. void CBitmapContent::MacSetBitmap(Environment* ev, FW_PlatformPict picHandle)
  325. {
  326.     FW_CPicture picture(picHandle);            // Does not take ownership    
  327.     fBitmap = FW_CBitmap(picture);
  328. }
  329. #endif
  330.  
  331. //========================================================================================
  332. //    class CBitmapSelectionContent
  333. //========================================================================================
  334.  
  335. //----------------------------------------------------------------------------------------
  336. //    CBitmapSelectionContent::CBitmapSelectionContent
  337. //----------------------------------------------------------------------------------------
  338. //    CBitmapSelectionContent constructor
  339.  
  340. CBitmapSelectionContent::CBitmapSelectionContent(Environment* ev, CBitmapPart* part, CBitmapSelection* selection, CBitmapContent* bitmapContent) :
  341.     FW_CContent(ev, part),
  342.     fBitmapPart(part),
  343.     fBitmapContent(bitmapContent),
  344.     fBitmapSelection(selection)    
  345. {
  346. }
  347.  
  348. //----------------------------------------------------------------------------------------
  349. //    CBitmapSelectionContent::~CBitmapSelectionContent
  350. //----------------------------------------------------------------------------------------
  351. //    CBitmapSelectionContent destructor
  352.  
  353. CBitmapSelectionContent::~CBitmapSelectionContent()
  354. {
  355. }
  356.  
  357. //----------------------------------------------------------------------------------------
  358. //    CBitmapSelectionContent::SelectEntireBitmap
  359. //----------------------------------------------------------------------------------------
  360.  
  361. void CBitmapSelectionContent::SelectEntireBitmap(Environment* ev)
  362. {
  363.     short width, height,rowBytes, pixelSize;
  364.     fBitmapContent->GetBitmap(ev).GetBitmapInfo(width, height, rowBytes, pixelSize);
  365.     FW_CPlatformRect bounds(0, 0, width, height);
  366.     SetSelectRect(bounds);
  367. }
  368.  
  369. //----------------------------------------------------------------------------------------
  370. //    CBitmapSelectionContent::Internalize
  371. //----------------------------------------------------------------------------------------
  372. //    ODF method
  373.  
  374. FW_Boolean CBitmapSelectionContent::Internalize(Environment* ev,
  375.                                                 ODStorageUnit* storageUnit, 
  376.                                                  FW_EStorageKinds storageKind,
  377.                                                 FW_CCloneInfo* cloneInfo)
  378. {
  379.     fBitmapSelection->CloseSelection(ev);
  380.  
  381.     FW_Boolean result = fBitmapContent->Internalize(ev, storageUnit, storageKind, cloneInfo);
  382.     
  383.     if (result)
  384.     {
  385.         fBitmapPart->AdjustFramesSize(ev);
  386.         fBitmapPart->PartChanged(ev);    
  387.     }
  388.     
  389.     return result;
  390. }
  391.  
  392. //----------------------------------------------------------------------------------------
  393. //    CBitmapSelectionContent::Externalize
  394. //----------------------------------------------------------------------------------------
  395. //    ODF method
  396.  
  397. void CBitmapSelectionContent::Externalize(Environment* ev,
  398.                                            ODStorageUnit* destinationSU,
  399.                                           FW_EStorageKinds storageKind,
  400.                                          FW_CCloneInfo* cloneInfo)
  401. {
  402.     FW_CBitmap bitmap = fBitmapContent->GetBitmap(ev).Copy(fSelectRect);
  403.     
  404.     fBitmapContent->ExternalizeBitmapShape(ev, destinationSU, bitmap);
  405.  
  406.     if (storageKind != FW_kPartStorage)
  407.             fBitmapContent->ExternalizePICTData(ev, destinationSU, bitmap);
  408. }
  409.  
  410. //---------------------------------------------------------------------------------------
  411. //    CBitmapSelectionContent::CreateDataFrameShape
  412. //---------------------------------------------------------------------------------------
  413. // Return the shape of the selected data. This will be added to the clipboard or
  414. // drag and drop storage unit.
  415.  
  416. ODShape* CBitmapSelectionContent::CreateDataFrameShape(Environment* ev) const
  417. {
  418.     ODShape* shape = NULL;
  419.     
  420.     // ----- we don't use the zoom factor -----
  421.     FW_CRect rect(fSelectRect);
  422.     if (rect != FW_kZeroRect)
  423.     {
  424.         rect.Offset(-rect.left, -rect.top);
  425.         shape = ::FW_NewODShape(ev, rect);
  426.     }
  427.     
  428.     return shape;
  429. }
  430.  
  431.